//获取小说接口
'use strict';
let uniId = require('uni-id')
let $lizhao = require('lizhao')
let db = uniCloud.database()
let dbCommad = db.command
exports.main = async (event, context) => {
	//处理url化的post接口,如果你的接口无需暴露接口给别人用就无需关心下面的代码
	if(event.body){
		let ip =event.headers['x-real-ip']
		event={
			...JSON.parse(event.body)
		},
		//这里需要手动传入context参数
		uniId = uniId.createInstance({ // 创建uni-id实例，其上方法同uniID
		    context:{
				PLATFORM:'app-plus',
				APPID:'__UNI__B10F710',
				LOCALE:'zh-Hans',
				CLIENTIP:ip
			}, // 传入context防止不同请求互相影响
		})
	}
	//end 处理url化
	
	//校验token
	let result = await payloadToken(event)
	if (result.code != 0) { //校验不成功【如果校验成功返回uid】
		return result
	}
	let res = {}
	//添加书籍
	if (event.active == 'addBook') {
		res = await addBook(event)
	}
	//删除书籍
	if (event.active == 'delectBook') {
		res = await delectBook(event)
	}
	//编辑书籍
	if (event.active == 'editBook') {
		res = await editBook(event)
	}
	//添加书的章节目录
	if (event.active == 'addBookChapter') {
		res = await addBookChapter(event)
	}
	//修改书的章节目录
	if (event.active == 'editBookChapter') {
		res = await editBookChapter(event)
	}
	
	// 返回数据给客户端
	return res
};
//修改书的章节目录
async function editBookChapter(event){
	let result = {}
	if(event.params&&event.params.bookId&&event.params.content&&event.params.urlname&&event.params.title&&event.params.fileID){
		//获取小说信息
		let bookInfo=await db.collection('bookList').doc(event.params.bookId).get()
		// 判断编辑的小说是否是你上架的小说（只能编辑自己上架的小说）
		if(bookInfo.affectedDocs==1&&bookInfo.data[0].uid==event.params.uid){
			//获取小说章节
			let res = await db.collection('bookMenu').doc(event.params.bookId).get()
			let chapterList=res.data[0].chapterList
			let obj=chapterList.find(item=>item.fileID==event.params.fileID);
			if(obj&&obj.fileID){
				// 删除云存储数据
				await uniCloud.deleteFile({ fileList:[obj.fileID]});
				//上传新的章节资源，向云存储中写入章节内容
				let OSS= await wirteOSS(event.params.content,event.params.urlname+'.json');
				chapterList=chapterList.map(item=>{
					if(item.fileID==event.params.fileID){
						item.fileID=OSS.fileID
						item.name=event.params.title
					}
					return item
				});
				let Result = await db.collection('bookMenu').doc(event.params.bookId).update({
					chapterList:chapterList
				})
				try{
					//更新下小说的最后章节
					await db.collection('bookList').doc(event.params.bookId).update({
						lastUpdate:'最后更新：'+$lizhao.timeFormat(),
					})
				}catch(e){
					//TODO handle the exception
				}
				
				result = {
					code: 0,
					data:Result,
					msg: '修改成功'
				}
				
			}else{
				result = {
					code: 400,
					msg: '修改失败，此章节不存在'
				}
			}
		}else{
			result = {
				code: 400,
				msg: '修改失败，此书不是您的小说或者此书不存在'
			}
		}
	}else {
		result = {
			code: 400,
			msg: '参数错误'
		}
	}
	return result
}
//添加章节目录
async function addBookChapter(event){
	let result = {}
	if(event.params&&event.params.bookId&&event.params.content&&event.params.urlname&&event.params.title){
		//获取要添加的小说信息
		let bookInfo=await db.collection('bookList').doc(event.params.bookId).get()
		// 判断编辑的小说是否是你上架的小说（只能编辑自己上架的小说）
		if(bookInfo.affectedDocs==1&&bookInfo.data[0].uid==event.params.uid){
			//获取小说章节
			let res = await db.collection('bookMenu').doc(event.params.bookId).get()
			let chapterList=res.data[0].chapterList
			//向云存储中写入章节内容
			let OSS= await wirteOSS(event.params.content,event.params.urlname+'.json');
			if(chapterList.length==0){//当前小说还没有目录，添加
				chapterList=[{
					name:event.params.title,
					fileID:OSS.fileID
				}]
			}else{
				let obj={
						name:event.params.title,
						fileID:OSS.fileID
					}
				chapterList.push(obj)
			}
			let Result = await db.collection('bookMenu').doc(event.params.bookId).update({
				chapterList:chapterList
			})
			try{
				//更新下小说的最后章节
				await db.collection('bookList').doc(event.params.bookId).update({
					lastChapter:event.params.title,
				})
			}catch(e){
				//TODO handle the exception
			}
			result = {
				code: 0,
				data:Result,
				msg: '添加成功'
			}
		}else{
			result = {
				code: 400,
				msg: '添加失败，此书不是您的小说或者此书不存在'
			}
		}
	}else {
		result = {
			code: 400,
			msg: '参数错误'
		}
	}
	return result
}
//编辑书籍
async function editBook(event){
	let result = {}
	if(event.params&&event.params._id){
		//获取要编辑的小说信息
		let bookInfo=await db.collection('bookList').doc(event.params._id).get()
		// 判断编辑的小说是否是你上架的小说（只能编辑自己上架的小说）
		if(bookInfo.affectedDocs==1&&bookInfo.data[0].uid==event.params.uid){
			//判断小说封面是否不一致（不一致需要清除掉云存储的资源和fileList中的数据）
			if(event.params.bookImageSrc&&bookInfo.data[0].bookImageSrc!=event.params.bookImageSrc){
				//如果原先存在封面就删除
				if(bookInfo.data[0].bookImageSrc){
					try{
						//删除fileList中的数据
						await db.collection('fileList').where({fileId:bookInfo.data[0].bookImageSrc}).remove()
						// 删除云存储数据
						await uniCloud.deleteFile({ fileList:[bookInfo.data[0].bookImageSrc]});
					}catch(e){
						console.error(e);
					}
				}else{
					//如果原先没有封面就更新fileList中资源被使用
					await db.collection('fileList').where({fileId:event.params.bookImageSrc}).update({
						isUse:true//被使用
					})
				}
			}else if(!event.params.bookImageSrc&&bookInfo.data[0].bookImageSrc){
				//如果原先有封面并且你删除了封面
				try{
					//删除fileList中的数据
					await db.collection('fileList').where({fileId:bookInfo.data[0].bookImageSrc}).remove()
					// 删除云存储数据
					await uniCloud.deleteFile({ fileList:[bookInfo.data[0].bookImageSrc]});
				}catch(e){
					console.error(e);
				}
			}
			let bookId=event.params._id
			delete event.params._id
			//剩下直接更新
			let updata= await db.collection('bookList').doc(bookId).update({
				...event.params
			})
			result = {
				code: 0,
				data:updata,
				msg: '成功'
			}
		}else{
			result = {
				code: 400,
				msg: '编辑失败，此书不是您的小说或者此书不存在'
			}
		}
	}else {
		result = {
			code: 400,
			msg: '参数错误'
		}
	}
	return result
}
//删除书籍
async function delectBook(event){
	let result = {}
	if(event.params&&event.params.bookId){
		//获取要删除的小说信息
		let bookInfo=await db.collection('bookList').doc(event.params.bookId).get()
		// 判断删除的小说是否是你上架的小说（只能删除自己上架的小说）
		if(bookInfo.affectedDocs==1&&bookInfo.data[0].uid==event.params.uid){
			//判断小说目录是否有，有的话需要删除目录中云存储的资源
			let bookMenu=await db.collection('bookMenu').doc(event.params.bookId).get()//获取小说目录
			if(bookMenu.affectedDocs==1){
				//如果小说目录存在，就删除云存储资源
				if(bookMenu.data[0].chapterList.length>0){
					let fileList=bookMenu.data[0].chapterList.map(item=>item.fileID)
					try{ await uniCloud.deleteFile({ fileList});}catch(e){}
				}
				try{
					//删除小说目录数据
					await db.collection('bookMenu').doc(event.params.bookId).remove()
				}catch(e){
				}
			}
			//判断小说封面有没有，有就要删除云存储中小说封面资源
			if(bookInfo.data[0].bookImageSrc){
				try{
					//删除fileList中的数据
					await db.collection('fileList').where({fileId:bookInfo.data[0].bookImageSrc}).remove()
					// 删除云存储数据
					await uniCloud.deleteFile({ fileList:[bookInfo.data[0].bookImageSrc]});
				}catch(e){
					console.log(e);
				}
			}
			//最后删除书籍
			let bookListDel=await db.collection('bookList').doc(event.params.bookId).remove()
			result = {
				code: 0,
				data:bookListDel,
				msg: '成功'
			}
		}else{
			result = {
				code: 400,
				msg: '删除失败，此书不是您的小说或者此书不存在'
			}
		}
		
	}else {
		result = {
			code: 400,
			msg: '参数错误'
		}
	}
	return result
}
//添加书籍
async function addBook(event){
	let result = {}
	if(event.params&&event.params.bookAuthor&&event.params.bookName&&event.params.bookSynopsis&&event.params.bookType&&event.params.bookTypeTxt){
		//获取用户信息
		const userInfo = await uniId.getUserInfo({uid: event.params.uid})
		if(userInfo.code==0&&userInfo.userInfo&&userInfo.userInfo.username){
			//插入小说书籍
			let data=await db.collection('bookList').add({
				...event.params,
				userName:userInfo.userInfo.username,
				lastUpdate:'最后更新：'+$lizhao.timeFormat()
			})
			// 再插入小说目录
			let data2=await db.collection('bookMenu').add({
				_id:data.id,
				bookName:event.params.bookName,
				chapterList:[]
			})
			//判断小说封面是否存在，如果存在，就要把fileList的中的图片资源标记为已使用
			if(event.params.bookImageSrc){
				await db.collection('fileList').where({
					fileId:event.params.bookImageSrc
				}).update({
					isUse:true//被使用
				})
			}
			result = {
				code: 0,
				data,
				msg: '成功'
			}
		}else{
			result = {
				code: 400,
				msg: '未获取到用户信息'
			}
		}
		
	}else {
		result = {
			code: 400,
			msg: '参数错误'
		}
	}
	return result
}
//校验token
async function payloadToken(event) {
	//校验token
	let payload = {}
	//用户带的参数
	let params = event.params || {}
	if (!event.token) {
		return {
			code: 403,
			msg: '用户未登录或登录失效'
		}
	}
	//校验token
	payload = await uniId.checkToken(event.token);
	//校验失败
	if (payload.code && payload.code > 0) {
		return payload
	}
	params.uid = payload.uid //校验成功之后会返回用户Id
	return {
		code: 0,
		...params
	}
}
//上传到云存储
async function wirteOSS(content,urlname) {
	//阿里云直接把字符串转成buff上传就可以了
	let buffer = Buffer.from(JSON.stringify(content))
	let result = await uniCloud.uploadFile({
		cloudPath:urlname,//阿里云直接写名字，可以不用全路径
		fileContent: buffer//阿里云内容不支持流所有不能使用fs.createReadStream()来读取流
	});
	return result
}
